package com.jt.aop;

import com.jt.anno.Pri;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

@Component
@Aspect
public class SpringAOP2 {

    private List<String> list = new ArrayList<>();//单机版本
    @PostConstruct
    public void init(){
        list.add("add");
        list.add("update");
        list.add("insert");
        list.add("select");
    }


    /**
     * 获取方法中的注解
     * 获取全新先的名称name = add
     * 判断add对比list集合看看有没有权限
     * true：有权限  执行目标方法
     * false：输出没有权限直接跳过
     * 规则
     *      1.如果有多个参数JoinPoint必须位于第一位!!!
     * 变态写法:
     *      可以直接写注解的名称
     * @param joinPoint
     * @param pri
     * @return
     * @throws Throwable
     */
    @Around("@annotation(pri)")//只是拦截注解，获取注解的数据
    public Object around(ProceedingJoinPoint joinPoint,Pri pri)throws Throwable{
        String name = pri.name();
        System.out.println("用户权限:"+name);
        Object result=null;
        boolean contains = list.contains(name);
        if (contains){
            System.out.println("有权限");
            result = joinPoint.proceed();
        }else{
            System.out.println("没有权限");
        }
        System.out.println("程序结束");
        return result;
    }


}
